package com.itheima.health.service.impl;


import com.alibaba.dubbo.common.utils.StringUtils;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.MenuDao;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.exception.MyException;
import com.itheima.health.pojo.Role;
import com.itheima.health.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @项目: health_parent
 * @包名: com.itheima.health.service.impl
 * @
 * @作者: long rui nan
 * @日期: 2021-01-17 20:39
 */
@Service(interfaceClass = RoleService.class)
public class RoleServiceImpl implements RoleService {
    @Autowired
    private RoleDao roleDao;

    /**
     * 检查项的分页查询
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult<Role> findPage(QueryPageBean queryPageBean) {
        // 限制pageSize在50以内
        if (queryPageBean.getPageSize() > 50) {
            throw new MyException("每页条数过大,请设置在50以内");
        }
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        // 条件查询
        if (StringUtils.isNotEmpty(queryPageBean.getQueryString())) {
            // 有查询条件， 模糊查询
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }

        Page<Role> page = roleDao.findByCondition(queryPageBean.getQueryString());
        //遍历查询结果
        for (Role role : page) {
            //判断角色中的描述是否为空
            if (role.getDescription() == null) {
                // 如果为空则提示无
                role.setDescription("无");
            }
        }
        PageResult<Role> pageResult = new PageResult<Role>(page.getTotal(), page.getResult());

        return pageResult;
    }

    /**
     * 添加角色
     *
     * @param role        角色信息
     * @param permissions 选中的权限id数组
     * @return
     */
    @Override
    @Transactional//- 添加事务控制
    public void add(Role role, Integer[] permissions, Integer[] menus) {
        //判断角色名称是否为空并且不能过长
        String keyword = role.getKeyword();
        if (StringUtils.isEmpty(keyword)) {
            throw new MyException("关键字不能为空");
        }
        if (keyword.length() > 32) {
            throw new MyException("关键字的长度不能超过32位");
        }
        if (keyword.matches("^[a-zA-Z]+")) {

            if (!keyword.contains("ROLE_")) {

                role.setKeyword("ROLE_" + keyword.toUpperCase());
            }
        } else {

            if (keyword.matches("^[_a-zA-Z]+")) {
                role.setKeyword(keyword.toUpperCase());
                if (!keyword.contains("ROLE_")) {

                    role.setKeyword("ROLE_" + role.getKeyword());
                }

            } else {
                throw new MyException("关键字只支持字母类型,请输入字母");
            }
        }
        String name = role.getName();
        if (StringUtils.isEmpty(name)) {
            throw new MyException("角色名称不能为空");
        }
        if (name.length() > 32) {
            throw new MyException("角色的长度不能超过32位");
        }
        int roleName = roleDao.findByName(name);
        if (roleName != 0) {
            throw new MyException("角色已存在,如要修改请前往编辑");
        }
        //- 先添加角色
        roleDao.add(role);
        //- 获取角色的id
        Integer roleId = role.getId();
        //- 遍历选中的权限id的数组
        if (null != permissions) {
            for (Integer permissionId : permissions) {

                //- 添加角色与权限的关系
                roleDao.addRolePermission(roleId, permissionId);
            }
        }

        if (null != menus) {
            //- 遍历选中的菜单id的数组
            for (Integer menuId : menus) {

                //- 添加角色与菜单的关系
                roleDao.addRoleMenu(roleId, menuId);
                //查询主菜单下子菜单的id集合
                List<Integer> integerList = roleDao.findBySonMenus(menuId);
                //遍历子集合id
                for (Integer integerId : integerList) {
                    //添加角色与子菜单的关联
                    roleDao.addBySonMenus(roleId, integerId);
                }
            }
        }
    }

    /**
     * 通过id删除角色
     *
     * @param id
     */
    @Override
    @Transactional //添加事务控制
    public void deleteById(int id) {
        // 通过角色id查询是否被用户使用了
        int count = roleDao.findCountByRoleId(id);
        // 使用了，抛出异常
        if (count > 0) {
            throw new MyException("该角色被用户使用了，不能删除");
        }
        // 没使用
        // 删除角色与权限的关系
        roleDao.deleteRolePermission(id);
        //删除角色与菜单的关系
        roleDao.deleteRoleMenu(id);
        // 删除角色
        roleDao.deleteById(id);
    }

    /**
     * 根据id查询角色信息
     *
     * @param id
     * @return
     */
    @Override
    public Role findById(int id) {
        return roleDao.findById(id);

    }

    /**
     * 根据角色id查询角色与权限的关联id数组
     *
     * @param id
     * @return
     */
    @Override
    public List<Integer> findPermissionsByRoleId(int id) {
        return roleDao.findPermissionsByRoleId(id);
    }

    /**
     * 修改角色
     *
     * @param role
     * @param permissions
     * @return
     */
    @Override
    @Transactional
    public void update(Role role, Integer[] permissions, Integer[] menus) {
        String keyword = role.getKeyword();
        if (StringUtils.isEmpty(keyword)) {
            throw new MyException("关键字不能为空");
        }
        if (keyword.length() > 32) {
            throw new MyException("关键字的长度不能超过32位");
        }
        if (keyword.matches("^[a-zA-Z]+")) {

            if (!keyword.contains("ROLE_")) {

                role.setKeyword("ROLE_" + keyword.toUpperCase());
            }
        } else {

            if (keyword.matches("^[_a-zA-Z]+")) {
                role.setKeyword(keyword.toUpperCase());
                if (!keyword.contains("ROLE_")) {

                    role.setKeyword("ROLE_" + role.getKeyword());
                }

            } else {
                throw new MyException("关键字只支持字母类型,请输入字母");
            }
        }
        String name = role.getName();
        if (StringUtils.isEmpty(name)) {
            throw new MyException("角色名称不能为空");
        }
        if (name.length() > 32) {
            throw new MyException("角色的长度不能超过32位");
        }
        //- 获取角色的id
        Integer roleId = role.getId();
        //删除角色与菜单的关系
        roleDao.deleteRoleMenu(roleId);
        // 删除角色与权限的关系
        roleDao.deleteRolePermission(roleId);

        //更新角色
        roleDao.update(role);
        for (Integer permissionId : permissions) {
            //- 添加角色与权限的关系
            roleDao.addRolePermission(roleId, permissionId);
        }
        if (null != menus) {
            //- 遍历选中的菜单id的数组
            for (Integer menuId : menus) {

                //- 添加角色与菜单的关系
                roleDao.addRoleMenu(roleId, menuId);
                //查询主菜单下子菜单的id集合
                List<Integer> integerList = roleDao.findBySonMenus(menuId);
                //遍历子集合id
                for (Integer integerId : integerList) {
                    //添加角色与子菜单的关联
                    roleDao.addBySonMenus(roleId, integerId);
                }
            }
        }
    }

    /**
     * 根据角色id查询角色与菜单的关联id数组
     *
     * @param id
     * @return
     */
    @Override
    public List<Integer> findMenuByRoleId(int id) {
        return roleDao.findMenuByRoleId(id);
    }


}
